//断言用于排除程序中不应该出现的逻辑错误,需要包含头文件<cassert> 或 <assert.h>
//语法 ： assert(表达式)
//断言就是判断表达式的值，如果为0(false)，程序将调用abort()函数中止
//如果非0(true)，程序继续运行

#include<iostream>
#include<cassert>
using namespace std;

void copydata(void* ptr1, void* ptr2)	//把ptr2中的数据复制到ptr1中
{
	assert(ptr1 && ptr2);	//断言ptr1和ptr2都不为空
	cout << "继续执行复制数据的代码。。。" << endl;
}

int main()
{
	int ii = 0, jj = 0;

	//copydata(nullptr, &jj);		//程序会断言中止,断言中止不是异常中止，不会被捕获
	copydata(&ii, &jj);

	return 0;
}


//注意:
//1.断言用于处理程序中不应该发生的错误，而不是逻辑上可能发生的错误
//2.不要把需要执行的代码放到断言的表达式中
//3.断言的代码一般放在函数/成员函数的第一行，表达式多为函数的形象









//静态断言，static_assert，在编译时就检查源代码，不需要包含头文件
//static_assert的第一个参数是常量表达式，而assert的表达式既可以是常量，也可以是变量
//语法 ：  static_assert(常量表达式，提示信息);
//在编译时，判断常量表达式的值，若是0(false)，则编译失败，显示提示信息

int main()
{
	const int ii = 0, jj = 0;
	static_assert(ii, "ii的值不合法.");	//编译失败，显示ii的值不合法



	return 0;
}